// @created: caoshi
// @date: 2021-06-29 04:55
package main

import "fmt"

type Cat struct {
	Color string
	Age   int
}

// 值方法
func (c Cat) play() {
	c.Color = "blue"
	fmt.Println(c.Color)
}

// 指针方法
func (c *Cat) play2() {
	c.Color = "yellow"
	fmt.Println(c.Color)
}

func main() {

	// c 值接收者
	c := Cat{"red", 1}
	fmt.Println(c.Color) // red
	// 值接收者调用值方法, 不会改变自身结构体成员的值
	//c.play()	// yellow
	//fmt.Println(c.Color) // red
	// 值接收者调用指针方法, 会改变自身结构体成员的值
	c.play2()            // ryellow
	fmt.Println(c.Color) // yellow

	fmt.Println("--------------------------")
	// c2 指针接收者
	c2 := &Cat{"red", 2}
	fmt.Println(c2.Color) // red

	// 指针接受者调用值方法
	c2.play()             // blue
	fmt.Println(c2.Color) // red

	// 指针接收者调用指针方法
	//c2.play2()	// yellow
	//fmt.Println(c2.Color)	// yellow

	/**
	总结:
		对于指针方法(方法定义处是指针类型)
			func (c *Cat) play() { }
		无论是指针接收者还是值接受者, 调用指针方法就会改变原有的结构体成员的值!

		对于值方法
			func (c Cat) func() { }
		指针接收者和值接受者, 调用值方法都不会改变原有的结构体成员的值!
	*/

}
